简介

cookie-parser是Express最常使用的中间件,实际上虽然他名义上是一个中间件但是实际上已经俨然成为了Express的一个不可或缺的部分.

在Express4的文档中,操作Cookie的部分就一个方法和一个属性.但是实际上如果你不使用cookie-parser中间件这些方法是根本就不存在的.

先从Express操作cookie说起

如果有一个纯净的Express,像这样:

const app = new express();
app.get('/login', (request, response) => {

    response.send('hello express');

});
app.listen(8888, '127.0.0.1');

我们如何操纵cookie?,显然只能在requestresponse中操纵.

express在request提供了:

  • cookies {Object}

response提供了:

  • res.cookie(name, value [, options])

简单来讲一个用于获取另外一个用于写入.

但是一切的前提就是你得使用cookie-parser中间件的前提下才可以拥有这个属性和方法,之前我就被坑了.

在上面的极简实例中我们得使用:

app.get('/login', (request, response) => {

    console.log(request.headers.cookie);
    response.send('hello express');

});

才可以获取没有使用cookie-parser中间件时候的cookie.

cookie-parser的具体功能

  • 已键值对的形式的获取cookie
  • 使用简单的方法设置cookie
  • 对于cookie进行签名

调用参数

cookie-parser在初始化的时候和写入cookie的时候允许传入参数.

在初始化的时候允许传入:

参数 类型 描述
secret string string[] 用于签名cookie的字符串
options object 选项基于cookie模块

cookie方法参数

基本格式如下res.cookie(name, value [, options]).

其中第一个参数是name是cookie的键,而value是键对应的的值.

options有如下的选项,基本都是cookie在HttpHeader中的参数:

参数 类型 描述
domain string 描述cookie作用的主机
path stirng 只有在匹配成功的地址才会发送cookie默认 /
encode function 用于cookie的编码默认是encodeURIComponent
expires date 使用GMT格式的时间来指定过期时间
maxAge number 指定多好毫秒后cookie失效
httpOnly boolean 设置后客户端无法访问cookie的内容
secure boolean 标记这个cookie只有在https协议下起作用
signed boolean 对于cookie进行签名
sameSite boolean 阻止cookie在跨站请求的时候发送

在MDN中有cookie的详细解释,上面除了signed外都有介绍.

https://developer.mozilla.org...

使用示例

基本示例:

const express = require('express');
const cookieParse = require('cookie-parser');

const app = new express();

app.use(cookieParse());

app.get('/login', (request, response) => {

    // 以键值对的形式获取所有的cookie
    console.log(reqeust.cookies);
    
    // 写入cookie
    response.cookie('key', 'value');

    response.send('hello express');

});

app.listen(8888, '127.0.0.1');

使用cookie签名:

const express = require('express');
const cookieParse = require('cookie-parser');

const app = new express();

// 传入一个字符串对cookie进行签名
app.use(cookieParse('hello world'));

app.get('/login', (request, response) => {

    // 获取没有签名的cookie
    console.log(request.cookies);
    // 获取签名的cookie
    console.log(request.signedCookies);
    
    // 写入签名cookie
    response.cookie('signed', 'true', {maxAge: 100000,signed:true});
    
    // 写入未签名cookie
    response.cookie('key', 'value');
    
    
    response.send('hello express');

});

app.listen(8888, '127.0.0.1');

ASCll
527 声望13 粉丝